package main

import (
	"fmt"
	"gitee.com/virtual-moon/vload"
)

// Order 订单信息
type Order struct {
	ID         int64  // 订单ID
	CreateBy   int64  // 创建人ID
	UpdateName string // 修改人名称（注意：这里故意只有创建人ID和修改人名称）
}

func main() {
	// 模拟数据
	orders := []Order{
		{ID: 1, CreateBy: 1001},
		{ID: 2, CreateBy: 1002},
		{ID: 3, CreateBy: 1003},
	}

	// 模拟用户数据
	userMap := map[int64]string{
		1001: "张三",
		1002: "李四",
		1003: "王五",
	}

	// 获取用户名的函数
	getUserNames := func(ids []int64) (map[int64]string, error) {
		result := make(map[int64]string)
		for _, id := range ids {
			if name, ok := userMap[id]; ok {
				result[id] = name
			}
		}
		return result, nil
	}

	// 错误示范：尝试使用创建人ID获取修改人名称
	fmt.Println("=== 错误示范 ===")
	err := vload.LoadQuick(&orders, "CreateBy", "UpdateName", getUserNames)
	if err != nil {
		// 这里会报错，因为字段类型不匹配
		fmt.Printf("预期的错误: %v\n", err)
	}

	// 正确示范：使用Loader并添加正确的映射
	fmt.Println("\n=== 正确示范 ===")
	type OrderWithBothFields struct {
		ID         int64
		CreateBy   int64  // 创建人ID
		CreateName string // 创建人名称
		UpdateBy   int64  // 修改人ID
		UpdateName string // 修改人名称
	}

	ordersWithBothFields := []OrderWithBothFields{
		{ID: 1, CreateBy: 1001, UpdateBy: 1002},
		{ID: 2, CreateBy: 1002, UpdateBy: 1003},
		{ID: 3, CreateBy: 1003, UpdateBy: 1001},
	}

	loader := vload.New()
	
	// 添加正确的字段映射
	loader.AddMapping("users", []vload.Pair{
		{
			SourceField: "CreateBy",
			TargetField: "CreateName",
		},
		{
			SourceField: "UpdateBy",
			TargetField: "UpdateName",
		},
	}, getUserNames)

	err = loader.Load(&ordersWithBothFields)
	if err != nil {
		fmt.Printf("加载数据失败: %v\n", err)
		return
	}

	// 打印结果
	for _, order := range ordersWithBothFields {
		fmt.Printf("订单ID: %d, 创建人: %s, 修改人: %s\n",
			order.ID, order.CreateName, order.UpdateName)
	}
}

/*
这个示例展示了：
1. 字段映射的严格性：不能用CreateBy（创建人ID）去获取UpdateName（修改人名称）
2. 正确的做法是：
   - CreateBy -> CreateName
   - UpdateBy -> UpdateName
3. 类型安全：确保源字段和目标字段的类型匹配
4. 字段存在性：确保结构体中包含所需的字段
*/
